"""
    定义图形管理器类：
        1：管理所有图形
        2： 提供计算所有图形总面积的方法
    
    具体图形：
        圆形（pi x r ** 2)
        矩形（长 x 宽）
        。。。

    测试：
        创建1个圆形对象，1个矩形对象，添加到图形管理器中。
        调用图形管理器的计算面积方法，输出结果
    
    要求：增加新图形，不修改图形管理器的代码
    体会： 面向对象三大特征：
                封装， 继承， 多态
            面向对象的设计原则： 
                开闭，单一，倒置
    
"""


class Figure:
    """
        父类
    """

    def calculate(self):
        raise NotImplementedError


class round(Figure):
    def __init__(self, radius):
        self.radius = radius

    def calculate(self):
        pi = 3.1415
        area = pi * self.radius ** 2
        print(f"该圆的面积为{area}")
        return area


class Rectangle(Figure):
    def __init__(self, length, wid):
        self.length = length
        self.wid = wid

    def calculate(self):
        print(f"该矩形面积为：{self.length * self.wid}")
        return self.length * self.wid


class Graphics:
    def __init__(self):
        self.__graphics = []

    def add_graphics(self, graphics):
        if isinstance(graphics, Figure):
            self.__graphics.append(graphics)
        else:
            raise ValueError("该图形不是Figure类或是他的子类！")

    def get_graphics(self):
        """
            返回列表所有元素
        """
        return self.__graphics

    def get_total_area(self):
        """
            累加所有图形的面积
        """
        total_area = 0
        for i in self.__graphics:
            total_area += i.calculate()
        return total_area


yx = round(20)
jx = Rectangle(10, 20)
glq = Graphics()
glq.add_graphics(yx)
glq.add_graphics(jx)
re = glq.get_total_area()
print(f"总面积为：{re:.2f}")

for i in glq.get_graphics():
    print(i.__dict__)
